• 问题

    先来看一个反例:

    try{
        int i = 0;
        while(true){
            range[i++].climb();
        }        
    } catch (ArrayIndexOutOfBoundsException){
    
    }
    

    在上面这个企图利用数组越界的异常从而跳出死循环。如果针对的是数组遍历的场景,这么做的目的是企图利用Java异常机制,来跳过遍历中每次都需要检查是否越界来达到性能优化。但是,这种用法显然是不合理的,那么,对异常的使用应该注意哪些问题?

  • 答案

    1. 异常应该只用于异常处理的情况,永远不应该应用到控制流中, 例如,上面的反例;
    2. 异常机制的设计初衷是用于不正常的情形,所以JVM实现不会对其优化,所以企图用异常来达到性能优化,是不可行的;
    3. 把代码放在try-catch块中反而阻止了现代JVM可能会执行的一些优化操作;
    4. 针对上例,对数组标准的遍历模式并不会导致冗余的检查,JVM会对其进行优化;
  • 结论

    在使用异常的时候,应该坚持异常只应该被当做异常来处理,而不应该企图利用异常来达到性能优化的目的

results matching ""

    No results matching ""